\chapter{相关技术概述}
\large{\songti{
本章主要对Vulkan做简单的介绍。
Vulkan是新一代图形应用程序接口，相对于OpenGL，它更贴近硬件底层，为图形开发者提供了更加详细的API，能够根据需求精准的控制GPU，发挥更好的性能。Vulkan具有跨平台的优势，可以在Windows、Linux、Android上运行。
\par 然而，使用Vulkan也增加了图形程序开发的复杂度，开发者不得不使用冗长的API,程序中每一个跟图形接口相关的细节都需要通过相关参数指定，包括图形渲染管线、渲染流程、窗口与交换链、帧缓冲、指令缓冲、队列、描述符以及内存管理。开发者需要做更多的工作以确保程序做出正确的行为。

}}
\section{Vulkan中纹理的使用}
在Vulkan中使用纹理的大致方法如下：
\subsection{创建图像对象}
根据图像格式、类型、大小、图层数量、布局方式、用途等参数创建图像对象（VkImage）；获取图像对象的储存需求，创建适合显卡读取的显存对象（VkDeviceMemory），将图像对象与显存对象绑定；该显存对象对CPU不可见，为了将纹理图像数据载入GPU，需要创建一个对CPU可见的缓冲对象(VkBuffer)，先将纹理图像数据复制到缓冲对象；
为了将数据从缓冲对象复制到图像对象关联的显存，变换图像对象的布局方式到传输接受方的布局。
\subsection{使用图像对象}
创建图像对象对应的图像视图对象（VkImageView）；创建采样器，设置对纹理的过滤和采样所需要的参数；设置新的描述符，让着色器能够访问图像资源。
\section{Vulkan的稀疏资源特性}
Vulkan中的缓冲对象和图像对象在被使用之前，必须完全连续地绑定到单个显存对象上，直到它们被销毁都不能改变绑定对象。
\par 但是如果是稀疏的图像对象则不受这些限制：稀疏资源可以不连续地绑定到一个或者多个显存对象上；在稀疏资源的生命周期内，可以将稀疏资源解绑并重新绑定。由此，可以利用该特性使得稀疏图像只有特定区域有内存支持。
\par 创建稀疏资源需要在创建资源对象时使用sparse binding和sparse residency标记，显卡是否支持稀疏资源可以通过查询得知。此外，对于绑定单位的大小，Vulkan也提供了相关标准。
\par 普通的图像对象与显存对象的绑定，只需调用函数vkBindImageMemory，而将稀疏的图像对象绑定到显存对象上是通过队列来执行的。这个队列与图形、计算、传输队列不同，它需要支持sparse特性。此外，向sparse队列上提交任务并不是像图形队列一样，记录指令到指令缓冲再提交，而是直接通过vkQueueBindSparse函数。这个命令的核心参数是VkBindSparseInfo结构体，其成员变量VkSparseImageMemoryBindInfo用于绑定稀疏图像的子区域，需要指定待绑定图像对象的句柄、要绑定的子区域数量、绑定信息数组。绑定信息数组即VkSparseImageMemoryBind结构体类型的数组，一个元素可视作一个纹理页，需要指定纹理页所在的mipmap层次、纹理页大小，纹理页位置，为其分配的显存对象句柄。